home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / lptalk-1.3 / config.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  4KB  |  184 lines

  1. /************************************************************************/
  2. /* LP-Talk
  3.     Version 1.0 [ 9/24/90]
  4.     Version 1.1 [ 9/27/90]
  5.     Version 1.2 [ 9/28/90]
  6. */
  7. /* TinyTalk configuration file support.                    */
  8. /*                                    */
  9. /*    Version 1.0 [ 1/24/90] : Initial implementation by ABR.        */
  10. /*        1.1 [ 1/25/90] : Added comments.            */
  11. /*                                    */
  12. /************************************************************************/
  13.  
  14. #include "tl.h"
  15. #include <stdio.h>
  16.  
  17. extern char *malloc(), *getenv();
  18.  
  19. static world_rec *the_worlds, *default_world;
  20.  
  21. int read_configuration()
  22. {
  23.   string config_name;
  24.   register FILE *config_file;
  25.  
  26.   get_file_name(config_name);
  27.   config_file = fopen(config_name, "r");
  28.   if (config_file == NULL) {
  29. /*  fprintf(stderr, "Couldn't open configuration file %s .\n", config_name); */
  30.     return (1);                /* Succeed even so. */
  31.   }
  32.  
  33.   parse_configuration(config_file);    /* Ignore any errors. */
  34.  
  35.   fclose(config_file);            /* Hope it works.... */
  36.  
  37.   return (1);                /* Always succeed, this is optional. */
  38. }
  39.  
  40. get_file_name(s)
  41.   register char *s;
  42. {
  43.   register char *env;
  44.  
  45.   env = getenv("LPTALK");        /* Check LPTALK first. */
  46.   if (env != NULL)
  47.     strcpy(s, env);
  48.   else
  49.     strcpy(s, "~/.lptalk");
  50.   expand_filename(s);
  51. }
  52.  
  53. parse_configuration(f)
  54.   FILE *f;
  55. {
  56.   if (parse_worlds(f))            /* Returns 0 at EOF or error */
  57.     parse_commands(f);
  58. }
  59.  
  60. int parse_worlds(f)
  61.   FILE *f;
  62. {
  63.   string line;
  64.   int done, eof_flag;
  65.  
  66.   the_worlds = NULL;
  67.   default_world = NULL;
  68.   done = FALSE;
  69.   eof_flag = FALSE;
  70.  
  71.   while (!done) {
  72.     if (fgets(line, MAXSTRLEN, f) == NULL) {
  73.       done = TRUE;
  74.       eof_flag = TRUE;
  75.       continue;
  76.     }
  77.  
  78.     if (line[0] == ';')            /* Comment */
  79.       continue;
  80.  
  81.     line[strlen(line)-1] = '\0';    /* Strip newline */
  82.  
  83.     if (line[0] == '\0') {        /* Blank line? */
  84.       done = TRUE;
  85.       continue;
  86.     }
  87.  
  88.     if (!add_world(line))
  89.       done = TRUE;
  90.   }
  91.  
  92.   return (!eof_flag);
  93. }
  94.  
  95. int add_world(line)            /* *** WARNING, LENGTH LIMITED *** */
  96.   char *line;
  97. {
  98.   register world_rec *new;
  99.   int count;
  100.  
  101.   new = (world_rec *) malloc(sizeof(world_rec));
  102.   count = sscanf(line, "%31s %31s %31s %31s %31s", new->world, new->character,
  103.          new->pass, new->address, new->port);
  104.   if (count == 3) {            /* No address info */
  105.     *(new->address) = '\0';
  106.     *(new->port) = '\0';
  107.     goto done;
  108.   }
  109.   else if (count == 5) {        /* All info specified */
  110.     if (!strcmp(new->world, "default"))
  111.       fprintf(stderr,"Warning: address for default world ignored");
  112.     goto done;
  113.   }
  114.   else {
  115.     fprintf(stderr,"Could not parse: %s .\n", line);
  116.     return (0);
  117.   }
  118.  
  119. done:
  120.  
  121.   if ((the_worlds == NULL) && (count == 5))    /* Set up default world, */
  122.     default_world = new;            /* if first one and all info. */
  123.  
  124.   new->next = the_worlds;
  125.   the_worlds = new;
  126.  
  127.   return (1);
  128. }
  129.  
  130. parse_commands(f)
  131.   FILE *f;
  132. {
  133.   /* All commands ought to be the same as from the keyboard. */
  134.   /* We hand them over there for processing. */
  135.  
  136.   string line;
  137.   int done;
  138.  
  139.   done = FALSE;
  140.  
  141.   while (!done) {
  142.     if (fgets(line, MAXSTRLEN, f) == NULL) {
  143.       done = TRUE;
  144.       break;
  145.     }
  146.  
  147.     line[strlen(line)-1] = '\0';    /* Strip newline */
  148.  
  149.     if ((line[0] == '\0') || (line[0] == ';'))    /* Blank line or comment. */
  150.       continue;                /* Ignore it. */
  151.  
  152.     if (*line != '/') {            /* Not a command! */
  153.       fprintf(stderr,"Not a command: %s .\n", line);
  154.       continue;
  155.     }
  156.  
  157.     handle_command(line, TRUE);        /* Special-case errors since we */
  158.                     /* aren't started up yet. */
  159.   }                    /* Actually, doesn't do anything now. */
  160.   
  161. }
  162.  
  163. world_rec *get_default_world()
  164. {
  165.   return (default_world);
  166. }
  167.  
  168. world_rec *find_world(name)
  169.   register char *name;
  170. {
  171.   register world_rec *p;
  172.  
  173.   p = the_worlds;
  174.   while ((p != NULL) && !(equalstr(p->world, name)))
  175.     p = p->next;
  176.  
  177.   return(p);
  178. }
  179.  
  180. world_rec *get_world_header()
  181. {
  182.   return (the_worlds);
  183. }
  184.